﻿using System;
using Zadani09.db.DAO;
using System.Collections.Generic;
using System.Linq;

namespace Zadani09.db.DAOimpl
{
    public class VstupenkaDAOmysql : AbstractDAO, IVstupenkaDAO
    {

        public void rezervuj(Uzivatel vstupenkaUzivatel, Vystava vstupenkaVystava, Vstupenka vstupenka)
        {
            Vstupenka nova = new Vstupenka();

            nova.IDUzivatel = vstupenkaUzivatel.IDUzivatel;
            nova.IDVystava = vstupenkaVystava.IDVystava;
            nova.PocetDeti = vstupenka.PocetDeti;
            nova.PocetDospeli = vstupenka.PocetDospeli;
            nova.Datum = vstupenka.Datum;

            this.rezervuj(nova);

        }

        public void rezervuj(string idUzivatele, string idVystavy, Vstupenka vstupenka)
        {
            Vstupenka nova = new Vstupenka();

            nova.IDUzivatel = uint.Parse(idUzivatele);
            nova.IDVystava = uint.Parse(idVystavy);
            nova.PocetDeti = vstupenka.PocetDeti;
            nova.PocetDospeli = vstupenka.PocetDospeli;
            nova.Datum = vstupenka.Datum;

            this.rezervuj(nova);
        }

        public void rezervuj(Vstupenka vstupenka)
        {
            initiateConnection();

            vstupenka.Stav = Vstupenka.REZERVOVANA;

            db.Vstupenka.InsertOnSubmit(vstupenka);
            db.SubmitChanges();

            closeConnection();
        }


        /*
         * U tech deletu si nejsem jisty co to udela, netestoval sem to,
         * ony tady sou totiz v tabulce vstupenka 2 cizi klice a buh vi,
         * jestli se to smaze nebo to bude rvat..nemel sem cas to otestit
         *
         * Navic, nevim jestli to pude smazat vubec, kdyz je tam slozeny PK
         */
        public void delete(Vstupenka vstupenka)
        {
            initiateConnection();

            db.Vstupenka.Attach(vstupenka);
            db.Vstupenka.DeleteOnSubmit(vstupenka);

            db.SubmitChanges();

            closeConnection();
        }

        public Vstupenka load(string idUzivatele, string idVystavy, DateTime datum)
        {
            initiateConnection();

            uint idUziv = uint.Parse(idUzivatele);
            uint idVys = uint.Parse(idVystavy);


            var result = from v in db.Vstupenka
                         where v.IDUzivatel == idUziv && v.IDVystava == idVys && v.Datum == datum
                         select new Vstupenka()
                         {
                             IDUzivatel = v.IDUzivatel,
                             IDVystava = v.IDVystava,
                             PocetDeti = v.PocetDeti,
                             PocetDospeli = v.PocetDospeli,
                             Datum = v.Datum,
                             Stav = v.Stav
                         };

            closeConnection();

            Vstupenka nahranaVstupenka = null;

            List<Vstupenka> list = new List<Vstupenka>();

            foreach (var item in result)
            {
                list.Add(item);
            }

            if (list.Count > 1 || list.Count < 1)
            {
                //throw exeption nejakou...
                nahranaVstupenka = null;
            }
            else
            {
                nahranaVstupenka = list.First<Vstupenka>();
            }

            return nahranaVstupenka;
        }


        public void update(Vstupenka nova)
        {
            initiateConnection();

            //slozeny primarni klic ze 3 atributu

            uint idU = nova.IDUzivatel;
            uint idV = nova.IDVystava;
            DateTime dat = nova.Datum;

            //neotestovany dotaz.. !
            var updateQ = db.Vstupenka.First(e => e.IDUzivatel == idU && e.IDVystava == idV && e.Datum == dat);

            //vstupenka zmenila majitele
            updateQ.IDUzivatel = nova.IDUzivatel;
            //presunuti vstupenky na jinou vystavu ?
            updateQ.IDVystava = nova.IDVystava;
            updateQ.PocetDeti = nova.PocetDeti;
            updateQ.PocetDospeli = nova.PocetDospeli;
            //rezervovana ? prodana ?
            updateQ.Stav = nova.Stav;
            //zmenila datum vystaveni ? hm..
            updateQ.Datum = nova.Datum;

            db.SubmitChanges();


            closeConnection();
        }


        public List<Vstupenka> nahrejVsechnyVstupenky(int odkud, int kolik)
        {
            initiateConnection();

            var result = from v in db.Vstupenka select v;

            List<Vstupenka> list = result.ToList<Vstupenka>();

            closeConnection();

            return list;
        }

        public List<Vstupenka> nahrejListVsupenekProUzivatele(int idUzivatele)
        {
            initiateConnection();

            var result = from v in db.Vstupenka
                         where v.IDUzivatel == idUzivatele
                         select v;

            List<Vstupenka> list = result.ToList<Vstupenka>();

            closeConnection();

            return list;
        }

    }
}
